`timescale 1ns / 1ps
`include "sm3_cfg.v"

// 顶层模块 sm3_top
module sm3_top (
    input                       clk,				//时钟
    input                       rst_n,				//复位
	
    input  [`INPT_DW1:0]        msg_inpt_d,			//消息数据 32bit
    input  [`INPT_BYTE_DW1:0]   msg_inpt_vld_byte,	//消息数据有效 4bit
    input                       msg_inpt_vld,		//消息数据末尾（表示当前数据为消息的最后一块）
    input                       msg_inpt_lst,		//消息数据字节有效（一般在非对齐的消息末尾标识有效字节）
    output                      msg_inpt_rdy,		//消息输入就绪
    output [255:0]              cmprss_otpt_res,	//杂凑结果输出
    output                      cmprss_otpt_vld		//杂凑结果输出有效
);

    // 内部连线定义
    wire                        pad_otpt_ena;
    wire [`INPT_DW1:0]          pad_otpt_d;
    wire                        pad_otpt_lst;
    wire                        pad_otpt_vld;

    wire [`INPT_DW1:0]          expnd_otpt_wj;
    wire [`INPT_DW1:0]          expnd_otpt_wjj;
    wire                        expnd_otpt_lst;
    wire                        expnd_otpt_vld;

    // 填充模块实例化
    sm3_pad_core U_sm3_pad_core (
        .clk                    (clk),
        .rst_n                  (rst_n),
        .msg_inpt_d_i           (msg_inpt_d),
        .msg_inpt_vld_byte_i    (msg_inpt_vld_byte),
        .msg_inpt_vld_i         (msg_inpt_vld),
        .msg_inpt_lst_i         (msg_inpt_lst),
        .msg_inpt_rdy_o         (msg_inpt_rdy),
        .pad_otpt_ena_i         (pad_otpt_ena),
        .pad_otpt_d_o           (pad_otpt_d),
        .pad_otpt_lst_o         (pad_otpt_lst),
        .pad_otpt_vld_o         (pad_otpt_vld)
    );

    // 扩展模块实例化
    sm3_expnd_core U_sm3_expnd_core (
        .clk                    (clk),
        .rst_n                  (rst_n),
        .pad_inpt_d_i           (pad_otpt_d),
        .pad_inpt_vld_i         (pad_otpt_vld),
        .pad_inpt_lst_i         (pad_otpt_lst),
        .pad_inpt_rdy_o         (pad_otpt_ena),
        .expnd_otpt_wj_o        (expnd_otpt_wj),
        .expnd_otpt_wjj_o       (expnd_otpt_wjj),
        .expnd_otpt_lst_o       (expnd_otpt_lst),
        .expnd_otpt_vld_o       (expnd_otpt_vld)
    );

    // 压缩模块实例化
    sm3_cmprss_core U_sm3_cmprss_core (
        .clk                    (clk),
        .rst_n                  (rst_n),
        .expnd_inpt_wj_i        (expnd_otpt_wj),
        .expnd_inpt_wjj_i       (expnd_otpt_wjj),
        .expnd_inpt_lst_i       (expnd_otpt_lst),
        .expnd_inpt_vld_i       (expnd_otpt_vld),
        .cmprss_otpt_res_o      (cmprss_otpt_res),
        .cmprss_otpt_vld_o      (cmprss_otpt_vld)
    );

endmodule